package com.liming.product.client;

import com.liming.common.pojo.dto.PageDTO;
import com.liming.common.pojo.dto.product.AddCategoryDTO;
import com.liming.common.pojo.dto.product.UpdateCategoryDTO;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.product.CategoryTreeVO;
import com.liming.common.pojo.vo.product.CategoryVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.Collection;
import java.util.List;

/**
 * @author liming
 * @date 2025/1/15
 */
@FeignClient(value = "product-service", contextId = "categoryClient", path = "/service/category")
public interface CategoryClient {

    /**
     * 分类树
     *
     * @return 分类树
     */
    @GetMapping
    List<CategoryTreeVO> tree();

    /**
     * 获取分类
     *
     * @param id 分类ID
     * @return 分类信息
     */
    @GetMapping("{id}")
    CategoryVO get(@PathVariable Long id);

    /**
     * 精选分类
     *
     * @return 精选分类
     */
    @GetMapping("selected")
    List<CategoryVO> selectedCategory();

    /**
     * 新增分类
     *
     * @param addCategoryDTO 新增分类DTO
     * @return 是否新增成功
     */
    @PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    Boolean add(AddCategoryDTO addCategoryDTO);

    /**
     * 更新分类
     *
     * @param updateCategoryDTO 更新分类DTO
     * @return 是否更新成功
     */
    @PutMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    Boolean update(UpdateCategoryDTO updateCategoryDTO);

    /**
     * 更新分类精选
     *
     * @param id 分类id
     * @return 是否更新成功
     */
    @PutMapping("selected/{id}")
    Boolean updateSelected(@PathVariable Long id);

    /**
     * 删除分类
     *
     * @param id 分类ID
     * @return 是否删除成功
     */
    @DeleteMapping("{id}")
    Boolean delete(@PathVariable Long id);

    /**
     * 获取该分类ID下的所有子分类ID和自身ID
     *
     * @param categoryId 分类ID
     * @return 该分类ID下的所有子分类ID和自身ID
     */
    @GetMapping("parentAndChildren/{categoryId}")
    Collection<Long> parentAndChildren(@PathVariable Long categoryId);

    @GetMapping("page")
    PageVO<CategoryVO> page(@SpringQueryMap PageDTO page);
}
